home *** CD-ROM | disk | FTP | other *** search
- # Parse Makefiles and Python Setup(.in) files.
-
- import regex
- import string
-
-
- # Extract variable definitions from a Makefile.
- # Return a dictionary mapping names to values.
- # May raise IOError.
-
- makevardef = regex.compile('^\([a-zA-Z0-9_]+\)[ \t]*=\(.*\)')
-
- def getmakevars(filename):
- variables = {}
- fp = open(filename)
- try:
- while 1:
- line = fp.readline()
- if not line:
- break
- if makevardef.match(line) < 0:
- continue
- name, value = makevardef.group(1, 2)
- # Strip trailing comment
- i = string.find(value, '#')
- if i >= 0:
- value = value[:i]
- value = string.strip(value)
- variables[name] = value
- finally:
- fp.close()
- return variables
-
-
- # Parse a Python Setup(.in) file.
- # Return two dictionaries, the first mapping modules to their
- # definitions, the second mapping variable names to their values.
- # May raise IOError.
-
- setupvardef = regex.compile('^\([a-zA-Z0-9_]+\)=\(.*\)')
-
- def getsetupinfo(filename):
- modules = {}
- variables = {}
- fp = open(filename)
- try:
- while 1:
- line = fp.readline()
- if not line:
- break
- # Strip comments
- i = string.find(line, '#')
- if i >= 0:
- line = line[:i]
- if setupvardef.match(line) >= 0:
- name, value = setupvardef.group(1, 2)
- variables[name] = string.strip(value)
- else:
- words = string.split(line)
- if words:
- modules[words[0]] = words[1:]
- finally:
- fp.close()
- return modules, variables
-
-
- # Test the above functions.
-
- def test():
- import sys
- import os
- if not sys.argv[1:]:
- print 'usage: python parsesetup.py Makefile*|Setup* ...'
- sys.exit(2)
- for arg in sys.argv[1:]:
- base = os.path.basename(arg)
- if base[:8] == 'Makefile':
- print 'Make style parsing:', arg
- v = getmakevars(arg)
- prdict(v)
- elif base[:5] == 'Setup':
- print 'Setup style parsing:', arg
- m, v = getsetupinfo(arg)
- prdict(m)
- prdict(v)
- else:
- print arg, 'is neither a Makefile nor a Setup file'
- print '(name must begin with "Makefile" or "Setup")'
-
- def prdict(d):
- keys = d.keys()
- keys.sort()
- for key in keys:
- value = d[key]
- print "%-15s" % key, str(value)
-
- if __name__ == '__main__':
- test()
-